#!/bin/bash

# 智能资源自适应启动脚本
PROJECT_NAME="simulate"
COMPOSE_FILE="docker-compose.yml"

# 安全检查函数
check_dependencies() {
    if ! command -v docker &> /dev/null; then
        echo "错误：Docker 运行时未找到" >&2
        exit 1
    fi
    
    if ! docker compose version &> /dev/null; then
        echo "错误：需要 Docker Compose V2 及以上版本" >&2
        exit 2
    fi
}

# 内存计算函数（安全阈值控制）
calculate_memory_params() {
    local total_mem_kb=$(grep MemTotal /proc/meminfo | awk '{print $2}')
    local total_mem_gb=$(echo "scale=2; $total_mem_kb / 1024 / 1024" | bc)
    
    # 安全内存分配策略
    local SAFETY_RESERVE=2  # 为系统保留2GB内存
    local MAX_HEAP_RATIO=0.65  # 最大堆内存占比
    
    local available_mem=$(echo "$total_mem_gb - $SAFETY_RESERVE" | bc)
    local heap_size=$(echo "$available_mem * $MAX_HEAP_RATIO" | bc | awk '{printf("%d\n", $1+0.5)}')
    
    # 设置最小内存保护
    (( heap_size < 2 )) && heap_size=2  # 保证最小2GB内存
    
    echo "$heap_size"
}

# CPU核心数检测
detect_cpu_cores() {
    local cores=$(nproc)
    local cpu_limit=$(( cores * 70 / 100 ))  # 按核心数70%设置CPU限制
    
    (( cpu_limit < 1 )) && cpu_limit=1  # 保证至少1个核心
    echo "$cpu_limit"
}

# 生成动态配置
generate_dynamic_config() {
    local heap_size=$1
    local cpu_limit=$2
    
    cat <<-EOF > docker-compose.override.yml
version: '3'
services:
  monitor-server:
    deploy:
      resources:
        limits:
          cpus: '${cpu_limit}'
    command:
      - java
      - -Xms${heap_size}g
      - -Xmx${heap_size}g
      - -XX:MaxRAMPercentage=70.0
      - -XX:+UseContainerSupport
      - -jar
      - /app/simulate.jar
      - --cpuUsage=0.7
      - --memoryUsage=0.85
EOF
}

# 主执行流程
main() {
    check_dependencies
    
    echo "系统资源检测中..."
    local heap_size=$(calculate_memory_params)
    local cpu_limit=$(detect_cpu_cores)
    
    echo "内存优化策略：分配JVM堆内存 ${heap_size}GB"
    echo "CPU优化策略：限制使用 ${cpu_limit} 个逻辑核心"
    
    generate_dynamic_config $heap_size $cpu_limit
    
    echo "启动容器服务..."
    docker compose -p $PROJECT_NAME \
        -f $COMPOSE_FILE \
        -f docker-compose.override.yml \
        up -d --build --force-recreate
    
    echo -e "\n实时服务状态："
    docker compose -p $PROJECT_NAME ps
    
    echo -e "\n资源监控命令："
    echo "内存监控：docker stats --format '{{.Name}} {{.MemUsage}}'"
    echo "CPU监控：docker stats --format '{{.Name}} {{.CPUPerc}}'"
}

main